package com.wzh.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author zh wang
 * @Create 2025/4/14 17:29
 */
@RestController
@RequestMapping("/test")
public class DemoController {
    @Autowired
    private DemoService demoService;
    @Autowired
    private EntityManagerService entityManagerService;
    //public DemoController(DemoService demoService, EntityManagerService entityManagerService) {
    //    this.demoService = demoService;
    //    this.entityManagerService = entityManagerService;
    //}
    @GetMapping("/test")
    public String test(){
        return "测试-test";
    }
    @GetMapping("/update")
    public void updateTable(){
        demoService.updateTable();
    }
    @GetMapping("/testTransaction")
    public void testTransaction(){
        demoService.testTransaction();
        System.out.println("testTransaction");
    }

    /**
     * 测试：在方法中，直接调用 `@Transactional`方法，是否会生成事务？
     */
    @GetMapping("/testTransaction3")
    public void testTransaction2(){
        demoService.testTransaction3();
        System.out.println("testTransaction");
    }
    /**
     * 测试：在普通方法中，多次调用 service.事务方法 每个事务方法是否独立？
     */
    @GetMapping("/testTransaction4")
    public void testTransaction4(){
        demoService.testTransaction41();
        demoService.testTransaction42();
        System.out.println("testTransaction4");
    }

    /**
     * 测试：在 异步方法中，通过AOP 调用本类@Transactional方法， 是否成功
     *  在异步方法中，无法调用 AopContext.currentProxy()
     *  AopContext.currentProxy() 必须在 AOP 代理的上下文中调用。
     * 如果调用 AopContext.currentProxy() 的代码运行在非代理线程中（例如异步线程或新线程），则无法获取到代理对象。
     */
    @GetMapping("/test4")
    public void test4(){
        System.out.println("GetMapping test4 开始");
        entityManagerService.test4();
        System.out.println("GetMapping test4 结束");
    }
    @GetMapping("/test5")
    public void test5(){
        System.out.println("GetMapping test5 开始");
        entityManagerService.newUsers();
        System.out.println("GetMapping test5 结束");
    }
}
